Pandas 可以把資料轉成單維度或雙維度的格式,並提供很多好用的 api 來對資料做處理.
在 Pandas 有兩個重要的觀念
安裝 Pandas
pip3 install pandas
使用 list 建立 Series 資料,左邊是編號從 0 開始,右邊的是資料型態是 int64
import pandas as pd
>>> data = pd.Series([1,2,3,4,5,6])
>>> print(data)
0 1
1 2
2 3
3 4
4 5
5 6
dtype: int64
也可以自定義索引給 index
參數
>>> data = pd.Series([1,2,3],index=['a','b','c'])
>>> data
a 1
b 2
c 3
dtype: int64
Series 已經提供了一些 api 可以使用,也可以對資料全部操作.
>>> data = pd.Series([1,2,3,4,5,6])
# # 取最大值
>>> data.max()
6
# 取最小值
>>> data.min()
1
# 取中位數
>>> data.median()
3.5
# 將元素都 * 3
>>> data = data * 3
>>> print(data)
0 3
1 6
2 9
3 12
4 15
5 18
dtype: int64
# 取前 3 大的數字
>>> data.nlargest(3)
5 6
4 5
3 4
dtype: int64
# 取最小的 2 個數字
>>> data.nsmallest(2)
0 1
1 2
dtype: int64
檢查 Series 的資料是否有等於 12 結果會是 boolean 值.
>>> data = data == 12
>>> print(data)
0 False
1 False
2 False
3 True
4 False
5 False
dtype: bool
如果 Series 內容是字串也有提供很多 api 可以使用
>>> data = pd.Series(['Daniel','Jack','Sam'])
# 轉小寫
>>> data.str.lower()
0 daniel
1 jack
2 sam
dtype: object
# 將 list 所有的字串元素用分隔符號 ';' 組成字串
>>> data.str.cat(sep=';')
'Daniel;Jack;Sam'
# 看是否包含 'a' 字串
>>> data.str.contains('a')
0 True
1 True
2 True
dtype: bool
# replace 字串
>>> data.str.replace('Daniel','Allen')
0 Allen
1 Jack
2 Sam
dtype: object
使用 dictionary 的資料建立 DataFrame
import pandas as pd
>>> data = pd.DataFrame({'name':['Daniel','Sam','Jack'],'age':[20,30,35]})
>>> print(data)
name age
0 Daniel 20
1 Sam 30
2 Jack 35
取得 name 該行的資料
>>> data['name']
0 Daniel
1 Sam
2 Jack
Name: name, dtype: object
取得第一列的資料
>>> data.iloc[0]
name Daniel
age 20
Name: 0, dtype: object
這個也叫DataFrame
耶!
感覺可以跟Spark整合的樣子?
確實是可以
# 執行時指定 python3
> export PYSPARK_PYTHON=python3;./pyspark
Python 3.7.4 (v3.7.4:e09359112e, Jul 8 2019, 14:54:52)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
19/10/14 10:55:04 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 2.4.4
/_/
Using Python version 3.7.4 (v3.7.4:e09359112e, Jul 8 2019 14:54:52)
SparkSession available as 'spark'.
>>> import numpy as np
>>> import pandas as pd
# 建立 pandas dataframe
>>> pd_dataframe = pd.DataFrame(np.random.rand(100, 3))
>>> print(pd_dataframe)
0 1 2
0 0.707611 0.895502 0.438209
1 0.406409 0.849364 0.518608
2 0.116227 0.183316 0.437908
3 0.145072 0.086041 0.673216
4 0.196261 0.632940 0.257096
.. ... ... ...
95 0.095377 0.068018 0.415200
96 0.061066 0.395440 0.447733
97 0.756381 0.715175 0.680191
98 0.289684 0.869211 0.987092
99 0.420487 0.987588 0.824905
[100 rows x 3 columns]
>>> type(pd_dataframe)
<class 'pandas.core.frame.DataFrame'>
#轉成 spark dataframe
>>> spark_dataframe = spark.createDataFrame(pd_dataframe)
>>> type(spark_dataframe)
<class 'pyspark.sql.dataframe.DataFrame'>
>>> spark_dataframe.show(5)
+-------------------+-------------------+-------------------+
| 0| 1| 2|
+-------------------+-------------------+-------------------+
| 0.7076107872426695| 0.8955019630532672|0.43820855633673794|
|0.40640948432256474| 0.8493643694516027| 0.5186082617314527|
|0.11622692146929692|0.18331601340671733| 0.4379077613719029|
|0.14507236330860762|0.08604079366559259| 0.6732164093020134|
|0.19626068783595485| 0.6329403382263261| 0.2570959487618999|
+-------------------+-------------------+-------------------+
only showing top 5 rows
#再把 spark dataframe 轉成 pandas dataframe
>>> pd_r_dataframe = spark_dataframe.select("*").toPandas()
>>> type(pd_r_dataframe)
<class 'pandas.core.frame.DataFrame'>
>>> print(>>>
>>> print(pd_r_dataframe)
0 1 2
0 0.707611 0.895502 0.438209
1 0.406409 0.849364 0.518608
2 0.116227 0.183316 0.437908
3 0.145072 0.086041 0.673216
4 0.196261 0.632940 0.257096
.. ... ... ...
95 0.095377 0.068018 0.415200
96 0.061066 0.395440 0.447733
97 0.756381 0.715175 0.680191
98 0.289684 0.869211 0.987092
99 0.420487 0.987588 0.824905
[100 rows x 3 columns]